package org.meteorshower.cms_common.controller;


import com.baomidou.mybatisplus.extension.service.IService;
import org.meteorshower.cms_common.result.ResponseObj;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Stream;

/**
 * 控制器基类，封装通用的 CRUD 操作
 * @param <T> 泛型参数，代表实体类型
 * @author MeteorShower
 * @version 1.0
 * @since 2025-06-08
 * @apiNote 子类必须实现 getService 方法以提供对应的 IService 实例(部分难以处理映射的类已经重写，使用多行非文档注释标出)
 */
public abstract class BaseController<T> {

    public abstract IService<T> getService();
    /**
     * 请求路径：/api/模块名/{id}
     * @method GET
     * @param id 在URL斜杠后写入id
     * @return 返回一个对象
     * */
    @GetMapping("/{id}")
    public ResponseObj<T> getById(@PathVariable String id) {
        return ResponseObj.ok(getService().getById(id));
    }
    /**
     * 请求路径：/api/模块名/all
     * @method GET
     * @return 返回全部对象集合
     * */
    @GetMapping("/all")
    public ResponseObj<List<T>> getAll() {
        return ResponseObj.ok(getService().list());
    }
    /**
     * 请求路径：/api/模块名
     * @method POST
     * @param object T T类型对象
     * @return 保存成功返回保存的对象
     * */
    @PostMapping
    public ResponseObj<Integer> insert(@RequestBody T object) {
        return ResponseObj.ok(getService().save(object) ? 1 : 0);
    }

    /**
     * 批量保存
     * @method POST
     * @param objects T 类型对象集合
     * @return 保存成功返回状态
     * */
    @PostMapping("/multi")
    public ResponseObj<Integer> batchInsert(@RequestBody List<T> objects) {
        return ResponseObj.ok(getService().saveBatch(objects) ? 1 : 0);
    }

    /**
     * 更新
     * @method PUT
     * @param object T 类型对象
     * @return 更新成功返回状态
     * */
    @PutMapping
    public ResponseObj<Integer> update(@RequestBody T object) {
        return ResponseObj.ok(getService().updateById(object) ? 1 : 0);
    }

    /**
     * 批量更新
     * @method PUT
     * @param objects T 类型对象集合
     * @return 批量更新成功返回状态
     * */
    @PutMapping("/multi")
    public ResponseObj<Integer> BatchUpdate(@RequestBody List<T> objects) {
        return ResponseObj.ok(getService().updateBatchById(objects) ? 1 : 0);
    }

    /**
     * 删除
     * @method DELETE
     * @param id 唯一标识字段(大多数为id，少部分使用int做标识符已在各类的控制层中重写)
     * @return 删除成功返回状态
     * */
    @DeleteMapping("/{id}")
    public ResponseObj<Integer> delete(@PathVariable String id) {
        return ResponseObj.ok(getService().removeById(id) ? 1 : 0);
    }

    /**
     * 批量删除
     * @method DELETE
     * @param ids 批量删除的id集合
     * @return 批量删除成功返回状态
     * */
    @DeleteMapping("/multi/{ids}")
    public ResponseObj<Integer> BatchDelete(@PathVariable String ids) {
        List<String> departments = Stream.of(ids.split(",")).toList();
        return ResponseObj.ok(getService().removeByIds(departments) ? 1 : 0);
    }
}
